package limfic.servicios.ciudad;

import limfic.dominio.Ciudad;
import limfic.persistencia.AbstractDB;
import limfic.persistencia.mysql.ciudad.ICiudadRepositorio;
import limfic.persistencia.RepositorioException;
import limfic.servicios.ServicioException;

import limfic.ui.IUsuarioInterfazCiudad;
import java.util.List;

/**
 * Esta clase implementa todas las operaciones de las interfaces de la ciudad
 * @author OpenCodes (Nicolas Tenca, Luis Soto)
 *
 * @see ICiudadServicio
 */
public class CiudadServicio implements ICiudadServicio {

    private AbstractDB fabricaDb;

    @Override
    public void init(IUsuarioInterfazCiudad ui) {
        fabricaDb = AbstractDB.getInstance();
    }

    @Override
    public void agregar(IUsuarioInterfazCiudad ui) throws ServicioException {
        //throw new UnsupportedOperationException("Not supported yet.");

        if (existe(ui.getNombreCiudad())) {
            throw new ServicioException("Ya existe una ciudad con el mismo nombre");
        }

        Ciudad ciudad = new Ciudad(ui.getIdCiudad(), ui.getNombreCiudad());

        ICiudadRepositorio repo;

        try {
            repo = fabricaDb.getCiudadRepositorio();
            repo.agregar(ciudad);

        } catch (RepositorioException e) {
            throw new ServicioException("Fallo la incorporacion de la ciudad Nombre:" + ciudad.getNombre(), e);
        }
    }

    @Override
    public void modificar(IUsuarioInterfazCiudad ui) throws ServicioException {
        //throw new UnsupportedOperationException("Not supported yet.");
        Ciudad ciudad = new Ciudad(ui.getIdCiudad(), ui.getNombreCiudad());

        ICiudadRepositorio repo;

        try {
            repo = fabricaDb.getCiudadRepositorio();
            repo.modificar(ciudad);

        } catch (RepositorioException e) {
            throw new ServicioException("Fallo la modificacion de la ciudad: Id:" + ciudad.getId() + ", Nombre: " + ciudad.getNombre(), e);
        }
    }

    @Override
    public void eliminar(IUsuarioInterfazCiudad ui) throws ServicioException {
        
        Ciudad ciudad = new Ciudad(ui.getIdCiudad(), ui.getNombreCiudad());

        ICiudadRepositorio repo;

        try {
            repo = fabricaDb.getCiudadRepositorio();
            repo.eliminar(ciudad);

        } catch (RepositorioException e) {
            throw new ServicioException("Fallo la eliminacion de la ciudad Nombre:" + ciudad.getNombre(), e);
        }
    }

    @Override
    public void listarTodas(IUsuarioInterfazCiudad ui) throws ServicioException {
        ICiudadRepositorio repo;

        try {
           
            repo = fabricaDb.getCiudadRepositorio();
            List<Ciudad> lista = repo.obtenerTodos();
            ui.setListaCiudades(lista);
        } catch (RepositorioException e) {
            throw new ServicioException("Fallo el listado de ciudades", e);
        }
    }

    @Override
    public void listarAlgunos(IUsuarioInterfazCiudad ui, String nombre) throws ServicioException {
        ICiudadRepositorio repo;

        try {

            repo = fabricaDb.getCiudadRepositorio();

            String[] parametrosBusqueda = {nombre};

            List<Ciudad> lista = repo.obtenerAlgunos(parametrosBusqueda);
            ui.setListaCiudades(lista);
        } catch (RepositorioException e) {
            throw new ServicioException("Fallo el listado de ciudades (Busqueda)", e);
        }
    }

    @Override
    public boolean existe(String nombre) throws ServicioException {
        ICiudadRepositorio repo;

        try {

            repo = fabricaDb.getCiudadRepositorio();

            String[] parametrosBusqueda = {nombre};

            return repo.existe(parametrosBusqueda);

        } catch (RepositorioException e) {

            throw new ServicioException(e.getMessage(), e);
        }
    }
}
